package cn.lg.soar.database.handler.type.base;

import cn.lg.soar.core.util.InnerSerializeUtils;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 动态json类型数据处理器，数据类型不固定的
 * @author luguoxiang
 * @date 2022-05-20
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
public class DynamicJsonTypeHandler extends AbstractJsonTypeHandler<Object> {

    private static final Logger LOGGER = LoggerFactory.getLogger(DynamicJsonTypeHandler.class);

    @Override
    protected Object parse(String json) {
        if (json == null) {
            return null;
        }
        if (json.contains("\"@type\":\"")) {
            // 自动解析类型
            try {
                return InnerSerializeUtils.deserializeByJson(json);
            }catch (RuntimeException e) {
                LOGGER.error("json 自动解析类型失败", e);
            }
        }
        try {
            return InnerSerializeUtils.parseObject(json);
        }catch (RuntimeException e) {
            LOGGER.error("json解析失败", e);
            return json;
        }
    }

    @Override
    protected String toJson(Object obj) {
        return InnerSerializeUtils.serializeToJson(obj);
    }

}
